package tcinert;
/*
 * Diplomova Prace: Vyuziti embedded modulu pro monitoring zivotnich funkci
 *                  pacienta 
 * Trida: SPI.java 
 * Autor: Tomas Cinert 
 * Vytvoreno: 20.4.2012
 */



/**
 * Trida SPI - po prijeti oznameni o dostupnosti dat (GPIO6), je spusteno cteni a verifikace dat
 * @version 0.9.2
 * @author Tomas Cinert
 */
public class SPI implements Runnable{
    String data=null;
    Zaznam log;
    Stav prijataData;
    StringBuffer zpracovanaData;
    String temp=null;
    /** 
     * Kostruktor
     */
    public SPI(Zaznam zaznam,String dataSPI, Stav reset,StringBuffer buffer) throws Exception {
        this.data=dataSPI;
        this.log=zaznam;
        this.prijataData=reset;
        this.zpracovanaData=buffer;
        if(data.length()<152){
            throw new Exception("Nebyly prijata veskera data");
        }
    }
    /**
     *Metoda na upravu dat - prevod bajtu na String
     *@param start,konec - indexy nacitani z pole
     *@throws IndexOutOfBoundsException - neprijaty veskara data
     *@throws IllegalStateException - ramec nebyl prijat  v poradku
     */
    private void upravaDatSPI(int start,int konec) throws IndexOutOfBoundsException,IllegalStateException{
        byte a;
        for(int i=0;i<146;){
             temp=new String(data.substring((start+i),(konec+i)));
             a=Byte.parseByte(temp);
             zpracovanaData.append((char)a);
             if((i==0)||(i==145))
             {
                 if(!testRamce(a)){
                     throw new IllegalStateException("Data nebyli prijaty v poradku.");
                 }
             }
        }
       
    }
    /**
     *Test, zda ramec je v poradku
     */
    private boolean testRamce(byte test)
    {
        char ab=(char)test;
        if((ab=='<')||(ab=='>'))
        {
            return true;
        }
        else
            return false;
    }
    /**
     *Metoda volana pomoci Thread.start() z vlakna Jadro
     **/
    public void run() {
        prijataData.setData(false);
        log.zapis("Vlakno na cteni dat a overeni dat z SPI staruje.",typZapisu.Informativni);
        try{
            upravaDatSPI(0,7);
            prijataData.setData(true);
            log.zapis("Data prijata v poradku.",typZapisu.Informativni);
        }catch(Exception ex){
            prijataData.setData(false);
            log.zapis("Prijeti datSPI nebylo uspesne z duvodu"+ex.toString(),typZapisu.Chybovy);
        }
    }
    
}
